import pygame,pygame.locals
import sys,os,time

#   2021-05-21 12:30    by 炸天帮成员
#   参考文件:   _4_pygame_demo_Part3_OK.py
#   目的：
#       将原本的_6_pygame中的所有用fill()产生的COLOR_BLOCK改用.PNG文件来替换。
#   新增了判断上一个颜色方块是否存活的函数，见[A0]注释。
#   新增了对于移动一个pygame.Surface对象，需要哪些函数，见[B0]~[B3]。
#   取消了while True ， 通过 for 来实现 pygame。

#   2021-05-22 22:34    by 炸天帮成员
#   今天下午被叫去派出所了-_-，听了一顿反诈骗的宣传，估计是05-18查看币安和火币的网站时被发现了，不过也好，成功阻止我入坑数字加密货币。这数字加密货币说实话还不如股票。
#   本文件的正宗升级版本见_8_pygame_demo_color_dictWithClass_0_ExOK.py
def game_init():
    pygame.init()
    pygame.display.init()

COLOR_BLACK = (0,0,0)
COLOR_WHITE = (255,255,255)
COLOR_BKG = COLOR_BLACK

WORKPLACE_PATH = os.getcwd()
IMAGE_PATH = f'{WORKPLACE_PATH}\COLOR_BLOCK_PNG\\'

WINDOW_X = 400
WINDOW_Y = 400
DISPLAYSURF = pygame.display.set_mode((WINDOW_X,WINDOW_Y))
DISPLAYSURF.fill(COLOR_BKG)
BKG_IMAGE = pygame.image.load(IMAGE_PATH + 'whiteBKG.png')


COLOR_BLOCK_X = 40
COLOR_BLOCK_Y = 40
COLOR_BLOCK_START_POSITION = (WINDOW_X,WINDOW_Y/2)
SHADOW_BLOCK_START_POSITION = (WINDOW_X,WINDOW_Y/4)
COLOR_BLOCK_MOVE_STEP = -5
SHADOW_BLOCK_MOVE_STEP = -5
class IRO_BLOCK(pygame.sprite.Sprite):
    def __init__(self,BLOCK_TYPE,BLOCK_ID=None,BLOCK_START_POSITION=(WINDOW_X,WINDOW_Y/2)):
        super().__init__
        if BLOCK_TYPE == 'COLOR_BLOCK' :
            self.image = pygame.image.load(IMAGE_PATH + 'greenBlock.png')
            self.surf = pygame.Surface((COLOR_BLOCK_X,COLOR_BLOCK_Y))
            self.rect = self.surf.get_rect(center = BLOCK_START_POSITION)
        elif BLOCK_TYPE == 'SHADOW_BLOCK' :
            self.image = pygame.image.load(IMAGE_PATH + 'blackBlock.png')
            self.surf = pygame.Surface((COLOR_BLOCK_X,COLOR_BLOCK_Y))
            self.rect = self.surf.get_rect(center = BLOCK_START_POSITION)
        else :
            pass

    def load(self,BLOCK_TYPE=None):
        DISPLAYSURF.blit(self.image,self.rect)
    
    def move(self,BLOCK_TYPE,BLOCK_ID,BLOCK_MOVE_STEP=-5):
        if BLOCK_TYPE == 'COLOR_BLOCK' :
            self.rect.move_ip(BLOCK_MOVE_STEP,0)
            if self.rect.right < 0 :
                #self.rect.left = WINDOW_X
                #return f'green {BLOCK_ID} is not alive'
                return False
            else :
                #return f'green {BLOCK_ID} is alive'
                return True
        elif BLOCK_TYPE == 'SHADOW_BLOCK' :
            self.rect.move_ip(BLOCK_MOVE_STEP,0)
            if self.rect.right < 0 :
                #self.rect.left = WINDOW_X
                #return f'shadow {BLOCK_ID} is not alive'
                return False
            else :
                #return f'shadow {BLOCK_ID} is alive'
                return True
        else :
            pass
#--------------------------------------------------------------------------------------------
#   因为 本程序中 pygame 的窗口大小为 400*400 ，而 颜色小方块大小为 40*40 ，
#   故 同一行中， 最多存在 10个 颜色小方块，
#   将创建两个方块列表，绿色小方块 和 黑色小方块 列表，内部各自10个元素。
COLOR_BLOCK_0 = IRO_BLOCK('COLOR_BLOCK')
SHADOW_BLOCK_0 = IRO_BLOCK('SHADOW_BLOCK')

GREEN_BLOCK_LIST = [COLOR_BLOCK_0]
GREEN_BLOCK_ALIVE_SIGNAL_LIST = [False] #   用于判断 上一个 颜色方块是否在屏幕上依旧 存活，  存活为True ,不存活为False  ,在IRO_BLOCK的move()，当其移出pygame窗口则视为不存活。
SHADOW_BLOCK_LIST = [SHADOW_BLOCK_0]
SHADOW_BLOCK_ALIVE_SIGNAL_LIST = [False]#   用于判断 上一个 颜色方块是否在屏幕上依旧 存活，  存活为True ,不存活为False  ,在IRO_BLOCK的move()，当其移出pygame窗口则视为不存活。
def IRO_BLOCK_INIT():
    for i in range(1,10):
        GREEN_BLOCK_LIST.append(IRO_BLOCK('COLOR_BLOCK'))
        GREEN_BLOCK_ALIVE_SIGNAL_LIST.append(False) 
        print(f'id{i} ',id(GREEN_BLOCK_LIST[i]))
        SHADOW_BLOCK_LIST.append(IRO_BLOCK('SHADOW_BLOCK'))
        SHADOW_BLOCK_ALIVE_SIGNAL_LIST.append(False)

#print('GREEN_BLOCK_LIST共有 ',len(GREEN_BLOCK_LIST),'个')
#print('SHADOW_BLOCK_LIST共有 ',len(SHADOW_BLOCK_LIST),'个')

def refresh_pygame():   #   这个函数要和    pygame.display.update() 一起结合使用  程序才不会运行至一半导致崩溃，另外仅有move_ip()而无blit()，也会导致图片不会刷新。
    pygame.time.Clock().tick(FPS)
    for event in pygame.event.get():
        if event.type == pygame.locals.QUIT:
            pygame.quit()
            sys.exit()
    DISPLAYSURF.blit(BKG_IMAGE,(0,0))   #   即背景图片的图层最先刷新，因为后出的blit()加载图片 会覆盖上一个blit()加载图片
                                        #   如果将此处注释掉 ， 则 那几个 IRO_BLOCK 中的 move() 会产生拖影。
                                        #   如果将背景图片的刷新给放入IRO_BLOCK的load()中，就会出现只显示 最后的blit()加载图片
#-----------------------------------------------------------------------------------------------------------------------------------------------------------
if __name__ == "__main__":
    game_init()
    IRO_BLOCK_INIT()
    FPS = 60

    for i in range(0,10):   #   使用for循环来限定 pygame 的运行次数，取代原本的 while True
        refresh_pygame()
        if i < 1 :
            GREEN_BLOCK_LIST[0].load('COLOR_BLOCK')
            SHADOW_BLOCK_LIST[0].load('SHADOW_BLOCK')
            GREEN_BLOCK_ALIVE_SIGNAL_LIST[0]=GREEN_BLOCK_LIST[0].move('COLOR_BLOCK',0)
            print('GREEN_BLOCK_ALIVE_SIGNAL_LIST = ',GREEN_BLOCK_ALIVE_SIGNAL_LIST)
            while GREEN_BLOCK_LIST[0].move('COLOR_BLOCK',0) == True :                       #   [A0 START]
                refresh_pygame()
                GREEN_BLOCK_LIST[0].load('COLOR_BLOCK')
                GREEN_BLOCK_ALIVE_SIGNAL_LIST[0]=GREEN_BLOCK_LIST[0].move('COLOR_BLOCK',0)  #   此处为movie_ip()，上一行必须要为 blit() 才会 使图片发生运动。
                print('GREEN_BLOCK_ALIVE_SIGNAL_LIST = ',GREEN_BLOCK_ALIVE_SIGNAL_LIST)
                pygame.display.update()
            if GREEN_BLOCK_ALIVE_SIGNAL_LIST[0] == False:                                   #   如果绿色方块已移出pygame窗口外（即绿色方块不存活），则 加载和移动 黑色方块。
                SHADOW_BLOCK_ALIVE_SIGNAL_LIST[0]=SHADOW_BLOCK_LIST[0].move('SHADOW_BLOCK',0)
                print('SHADOW_BLOCK_ALIVE_SIGNAL_LIST = ',SHADOW_BLOCK_ALIVE_SIGNAL_LIST)
                while SHADOW_BLOCK_ALIVE_SIGNAL_LIST[0] == True :                           #   使pygame.Surface对象运动起来的必要步骤见下[B0]~[B3]
                    refresh_pygame()                                                        #   [B0] 防止崩溃，需要结束pygame的函数，内含背景的刷新，一定要放在最前面。
                    SHADOW_BLOCK_LIST[0].load('SHADOW_BLOCK')                               #   [B1] 加载pygame.Surface对象并覆盖在窗口上
                    SHADOW_BLOCK_ALIVE_SIGNAL_LIST[0] = SHADOW_BLOCK_LIST[0].move('SHADOW_BLOCK',0) #   [B2] 移动pygame.Surface对象
                    print('SHADOW_BLOCK_ALIVE_SIGNAL_LIST = ',SHADOW_BLOCK_ALIVE_SIGNAL_LIST)
                    pygame.display.update()                                                 #   [A0 END][B3] 全局刷新pygame的显示，一般放在移动完毕的后面。
        else :
            if SHADOW_BLOCK_ALIVE_SIGNAL_LIST[i-1] == False :
                GREEN_BLOCK_LIST[i].load('COLOR_BLOCK')
                SHADOW_BLOCK_LIST[i].load('SHADOW_BLOCK')
                GREEN_BLOCK_ALIVE_SIGNAL_LIST[i]=GREEN_BLOCK_LIST[i].move('COLOR_BLOCK',i)
                print(f'{i} alive_signal = ',GREEN_BLOCK_ALIVE_SIGNAL_LIST)
                while GREEN_BLOCK_LIST[i].move('COLOR_BLOCK',0) == True :                       #   [A0 START]
                    refresh_pygame()
                    GREEN_BLOCK_LIST[i].load('COLOR_BLOCK')
                    GREEN_BLOCK_ALIVE_SIGNAL_LIST[i]=GREEN_BLOCK_LIST[i].move('COLOR_BLOCK',0)  #   此处为movie_ip()，上一行必须要为 blit() 才会 使图片发生运动。
                    print(f'{i} GREEN_BLOCK_ALIVE_SIGNAL_LIST = ',GREEN_BLOCK_ALIVE_SIGNAL_LIST)
                    pygame.display.update()
                if GREEN_BLOCK_ALIVE_SIGNAL_LIST[i] == False:
                    SHADOW_BLOCK_ALIVE_SIGNAL_LIST[i]=SHADOW_BLOCK_LIST[i].move('SHADOW_BLOCK',0)
                    print(f'{i} SHADOW_BLOCK_ALIVE_SIGNAL_LIST = ',SHADOW_BLOCK_ALIVE_SIGNAL_LIST)
                    while SHADOW_BLOCK_ALIVE_SIGNAL_LIST[i] == True :                           #   同上的[B0]~[B3]
                        refresh_pygame()                                                        #   [B0] 
                        SHADOW_BLOCK_LIST[i].load('SHADOW_BLOCK')                               #   [B1] 
                        SHADOW_BLOCK_ALIVE_SIGNAL_LIST[i] = SHADOW_BLOCK_LIST[i].move('SHADOW_BLOCK',0) #   [B2] 
                        print(f'{i} SHADOW_BLOCK_ALIVE_SIGNAL_LIST = ',SHADOW_BLOCK_ALIVE_SIGNAL_LIST)
                        pygame.display.update()                                                 #   [A0 END][B3]
                pygame.display.update()
                print('SHADOW_BLOCK_LIST[1] : ',SHADOW_BLOCK_LIST[1].rect)  #   查看第二个 SHADOW_BLOCK_LIST元素的 左上角坐标和长宽值。
                print('SHADOW_BLOCK_LIST[9] : ',SHADOW_BLOCK_LIST[9].rect)  #   查看最后一个 SHADOW_BLOCK_LIST元素的 左上角坐标和长宽值。
        pygame.display.update()

    